package com.example.demo.pdf.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @ClassName PdfTemplateUtil
 * @Description PDF模板工具类
 * @Author MingChang.Wei
 * @Date 2025/9/26
 **/
@Slf4j
public class PdfTemplateUtil {

    // 模板变量匹配模式 ${variableName}
    private static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\$\\{([^}]+)}");

    /**
     * 读取模板文件内容
     * @param templatePath 模板文件路径
     * @return 模板内容
     */
    public static String readTemplate(String templatePath) {
        try {
            ClassPathResource resource = new ClassPathResource(templatePath);
            if (resource.exists()) {
                return new String(resource.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
            } else {
                // 尝试从文件系统读取
                return new String(Files.readAllBytes(Paths.get(templatePath)), StandardCharsets.UTF_8);
            }
        } catch (IOException e) {
            log.error("读取模板文件失败: {}", templatePath, e);
            throw new RuntimeException("读取模板文件失败: " + templatePath, e);
        }
    }

    /**
     * 替换模板中的变量
     * @param template 模板内容
     * @param data 数据
     * @return 替换后的内容
     */
    public static String replaceVariables(String template, Map<String, Object> data) {
        if (!StringUtils.hasText(template) || data == null || data.isEmpty()) {
            return template;
        }

        Matcher matcher = TEMPLATE_PATTERN.matcher(template);
        StringBuffer result = new StringBuffer();

        while (matcher.find()) {
            String variableName = matcher.group(1);
            Object value = data.get(variableName);
            String replacement = value != null ? value.toString() : "";
            
            // 转义特殊字符
            replacement = Matcher.quoteReplacement(replacement);
            matcher.appendReplacement(result, replacement);
        }
        matcher.appendTail(result);

        return result.toString();
    }

    /**
     * 验证模板格式
     * @param templateContent 模板内容
     * @return 是否有效
     */
    public static boolean validateTemplate(String templateContent) {
        if (!StringUtils.hasText(templateContent)) {
            return false;
        }

        // 检查基本的FO格式
        return templateContent.contains("<?xml") || 
               templateContent.contains("<fo:root") ||
               templateContent.contains("<html") ||
               templateContent.contains("<!DOCTYPE");
    }

    /**
     * 提取模板中的变量名
     * @param template 模板内容
     * @return 变量名列表
     */
    public static Set<String> extractVariables(String template) {
        Set<String> variables = new HashSet<>();
        if (!StringUtils.hasText(template)) {
            return variables;
        }

        Matcher matcher = TEMPLATE_PATTERN.matcher(template);
        while (matcher.find()) {
            variables.add(matcher.group(1));
        }
        
        return variables;
    }

    /**
     * 生成默认模板（简单表格）
     * @param title 标题
     * @param headers 表头
     * @return FO模板内容
     */
    public static String generateDefaultTableTemplate(String title, String[] headers) {
        StringBuilder template = new StringBuilder();
        template.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
        template.append("<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\">\n");
        template.append("  <fo:layout-master-set>\n");
        template.append("    <fo:simple-page-master master-name=\"A4\" page-height=\"29.7cm\" page-width=\"21cm\" margin=\"2cm\">\n");
        template.append("      <fo:region-body/>\n");
        template.append("    </fo:simple-page-master>\n");
        template.append("  </fo:layout-master-set>\n");
        template.append("  <fo:page-sequence master-reference=\"A4\">\n");
        template.append("    <fo:flow flow-name=\"xsl-region-body\">\n");
        template.append("      <fo:block font-size=\"18pt\" text-align=\"center\" margin-bottom=\"20pt\">\n");
        template.append("        ").append(title).append("\n");
        template.append("      </fo:block>\n");
        
        if (headers != null && headers.length > 0) {
            template.append("      <fo:table table-layout=\"fixed\" width=\"100%\">\n");
            
            // 生成表头
            template.append("        <fo:table-header>\n");
            template.append("          <fo:table-row>\n");
            for (String header : headers) {
                template.append("            <fo:table-cell border=\"1pt solid black\" padding=\"4pt\">\n");
                template.append("              <fo:block font-weight=\"bold\">").append(header).append("</fo:block>\n");
                template.append("            </fo:table-cell>\n");
            }
            template.append("          </fo:table-row>\n");
            template.append("        </fo:table-header>\n");
            
            // 数据行模板
            template.append("        <fo:table-body>\n");
            template.append("          <!-- 数据行将在这里生成-->\n");
            template.append("          <fo:table-row>\n");
            for (int i = 0; i < headers.length; i++) {
                template.append("            <fo:table-cell border=\"1pt solid black\" padding=\"4pt\">\n");
                template.append("              <fo:block>${data").append(i).append("}</fo:block>\n");
                template.append("            </fo:table-cell>\n");
            }
            template.append("          </fo:table-row>\n");
            template.append("        </fo:table-body>\n");
            template.append("      </fo:table>\n");
        }
        
        template.append("    </fo:flow>\n");
        template.append("  </fo:page-sequence>\n");
        template.append("</fo:root>\n");
        
        return template.toString();
    }
}
